In [1]:
from pathlib import Path

from ipyniivue import download_dataset

BASE_API_URL = "https://niivue.com/demos/images/"
DATA_FOLDER = Path("images")

# Download data for example
download_dataset(
    BASE_API_URL,
    DATA_FOLDER,
    files=[
        "niivue.basic.nvd",
        "niivue.drawing.nvd",
        "niivue.mesh.nvd",
        "hippo.nii.gz",
    ],
)
Downloading niivue.basic.nvd...
Downloading niivue.drawing.nvd...
Downloading niivue.mesh.nvd...
hippo.nii.gz already exists.
Dataset downloaded successfully to images.
In [2]:
import ipywidgets as widgets
from IPython.display import display

from ipyniivue import NiiVue

nv = NiiVue()
display(nv)

# Document paths to load
document_paths = [
    str(DATA_FOLDER / "niivue.basic.nvd"),
    str(DATA_FOLDER / "niivue.drawing.nvd"),
    str(DATA_FOLDER / "niivue.mesh.nvd"),
]


# Load the first document by default
@nv.on_canvas_attached
def load_first_document():
    """Load first document."""
    nv.load_document(document_paths[0])


# Create preview buttons for documents
def create_document_button(path, index):
    """Create a button for loading a document."""
    name = path.split("/")[-1]
    button = widgets.Button(
        description=f"Load {name}", layout=widgets.Layout(width="auto", margin="2px")
    )

    def on_click(b):
        nv.load_document(path)
        status_output.value = f"Loaded: {name}"

    button.on_click(on_click)
    return button


# Create buttons for each document
document_buttons = [
    create_document_button(path, i) for i, path in enumerate(document_paths)
]

# Status display
status_output = widgets.HTML(value="Loaded: niivue.basic.nvd")

# Track hippocampus state
hippo_state = {"is_showing": False}
hippo_path = DATA_FOLDER / "hippo.nii.gz"


def toggle_hippocampus(b):
    """Toggle the hippocampus overlay."""
    if hippo_state["is_showing"]:
        nv.volumes = nv.volumes[:-1]
        b.description = "Add Hippocampus"
        hippo_state["is_showing"] = False
        status_output.value = "Removed hippocampus overlay"
    else:
        # Add hippocampus
        nv.add_volume({"path": hippo_path, "colormap": "bluegrn", "opacity": 0.7})
        b.description = "Remove Hippocampus"
        hippo_state["is_showing"] = True
        status_output.value = "Added hippocampus overlay"


# Create toggle button
hippo_button = widgets.Button(description="Add Hippocampus", button_style="info")
hippo_button.on_click(toggle_hippocampus)


def save_document(b):
    """Save the current scene as a document."""
    nv.save_document("my_document.nvd")
    status_output.value = "Document saved as 'my_document.nvd'"


# Create save button
save_button = widgets.Button(description="Save Document", button_style="success")
save_button.on_click(save_document)

# Create organized layout
file_controls = widgets.VBox(
    [
        widgets.HTML("<h3>File Operations</h3>"),
        widgets.HBox([save_button]),
        widgets.HTML("<h3>Load Documents</h3>"),
        widgets.VBox(document_buttons),
        widgets.HTML("<h3>Volume Controls</h3>"),
        widgets.HBox([hippo_button]),
        widgets.HTML("<h3>Status</h3>"),
        status_output,
    ]
)

# Display controls
display(file_controls)
display(nv)